/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Engine2D.math;

/**
 *
 * @author Garys
 */
public class Matrix2i {

    /**
     * 
     */
    protected int[][] matrix = new int[2][2];

    /**
     * 
     * @param matrix
     */
    public Matrix2i(int[] matrix) {

        this.matrix[0][0] = matrix[0];
        this.matrix[0][1] = matrix[1];
        this.matrix[1][0] = matrix[2];
        this.matrix[1][1] = matrix[3];

    }

    /**
     * 
     * @param x
     * @param y
     */
    public Matrix2i(Vector2i x, Vector2i y) {
        this.matrix[0][0] = x.x;
        this.matrix[0][1] = x.y;
        this.matrix[1][0] = y.x;
        this.matrix[1][1] = y.y;
    }

    /**
     * 
     * @param x
     * @param y
     */
    public Matrix2i(int[] x, int[] y) {
        this.matrix[0][0] = x[0];
        this.matrix[0][1] = x[1];
        this.matrix[1][0] = y[0];
        this.matrix[1][1] = y[1];
    }

    /**
     * 
     * @param xx
     * @param xy
     * @param yx
     * @param yy
     */
    public Matrix2i(int xx, int xy, int yx, int yy) {
        this.matrix[0][0] = xx;
        this.matrix[0][1] = xy;
        this.matrix[1][0] = yx;
        this.matrix[1][1] = yy;
    }

    /**
     * 
     * @return
     */
    public Matrix2i negateMatrix2i() {
        return new Matrix2i(-matrix[0][0], -matrix[0][1], -matrix[1][0], -matrix[1][1]);
    }

    /**
     * 
     * @param matrix2i
     * @return
     */
    public Matrix2i addMatrix2i(Matrix2i matrix2i) {

        return new Matrix2i(this.matrix[0][0] + matrix2i.matrix[0][0], this.matrix[0][1] + matrix2i.matrix[0][1],
                this.matrix[1][0] + matrix2i.matrix[1][0], this.matrix[1][1] + matrix2i.matrix[1][1]);

    }

    /**
     * 
     * @param matrix2i
     */
    public void addMatrix2iToThis(Matrix2i matrix2i) {
        this.matrix[0][0] += matrix2i.matrix[0][0];
        this.matrix[0][1] += matrix2i.matrix[0][1];
        this.matrix[1][0] += matrix2i.matrix[1][0];
        this.matrix[1][1] += matrix2i.matrix[1][1];
    }

    /**
     * 
     * @param matrix2i
     * @return
     */
    public Matrix2i subtractMatrix2i(Matrix2i matrix2i) {

        return new Matrix2i(this.matrix[0][0] - matrix2i.matrix[0][0], this.matrix[0][1] - matrix2i.matrix[0][1],
                this.matrix[1][0] - matrix2i.matrix[1][0], this.matrix[1][1] - matrix2i.matrix[1][1]);

    }

    /**
     * 
     * @param matrix2i
     */
    public void subtractMatrix2iToThis(Matrix2i matrix2i) {
        this.matrix[0][0] -= matrix2i.matrix[0][0];
        this.matrix[0][1] -= matrix2i.matrix[0][1];
        this.matrix[1][0] -= matrix2i.matrix[1][0];
        this.matrix[1][1] -= matrix2i.matrix[1][1];
    }

    /**
     * 
     * @param scale
     * @return
     */
    public Matrix2i scaleMatrix2i(int scale) {

        return new Matrix2i(this.matrix[0][0] * scale, this.matrix[0][1] * scale,
                this.matrix[1][0] * scale, this.matrix[1][1] * scale);

    }

    /**
     * 
     * @param scale
     */
    public void scaleMatrix2iToThis(int scale) {
        this.matrix[0][0] *= scale;
        this.matrix[0][1] *= scale;
        this.matrix[1][0] *= scale;
        this.matrix[1][1] *= scale;
    }

    /**
     * 
     * @param matrix2i
     * @return
     */
    public Matrix2i multiplyMatrix2i(Matrix2i matrix2i) {

        return new Matrix2i(this.matrix[0][0] * matrix2i.matrix[0][0], this.matrix[0][1] * matrix2i.matrix[0][1],
                this.matrix[1][0] * matrix2i.matrix[1][0], this.matrix[1][1] * matrix2i.matrix[1][1]);

    }

    /**
     * 
     * @param matrix2i
     */
    public void multiplyMatrix2iToThis(Matrix2i matrix2i) {

        this.matrix[0][0] *= matrix2i.matrix[0][0];
        this.matrix[0][1] *= matrix2i.matrix[0][1];
        this.matrix[1][0] *= matrix2i.matrix[1][0];
        this.matrix[1][1] *= matrix2i.matrix[1][1];

    }

    /**
     * 
     * @param row
     * @param vector2i
     */
    public void setRow(int row, Vector2i vector2i) {
        matrix[row][0] = vector2i.x;
        matrix[row][1] = vector2i.y;
    }

    /**
     * 
     * @param column
     * @param vector2i
     */
    public void setColumn(int column, Vector2i vector2i) {
        matrix[0][column] = vector2i.x;
        matrix[1][column] = vector2i.y;
    }

    /**
     * 
     * @param row
     * @return
     */
    public Vector2i getRow(int row) {
        return new Vector2i(matrix[row][0], matrix[row][1]);
    }

    /**
     * 
     * @param column
     * @return
     */
    public Vector2i getColumn(int column) {
        return new Vector2i(matrix[0][column], matrix[1][column]);
    }

    /**
     * 
     */
    public void setIdentity() {
        matrix[0][0] = 1;
        matrix[0][1] = 0;
        matrix[1][0] = 0;
        matrix[1][1] = 1;
    }

    /**
     * 
     */
    public void setZero() {
        matrix[0][0] = 0;
        matrix[0][1] = 0;
        matrix[1][0] = 0;
        matrix[1][1] = 0;
    }

    /**
     * 
     */
    public void transpose() {
        int i = matrix[0][1];
        matrix[0][1] = matrix[1][0];
        matrix[1][0] = i;
    }

    /**
     * 
     * @param matrix2i
     */
    public void getTranspose(Matrix2i matrix2i) {

        matrix2i.matrix[0][0] = matrix[0][0];
        matrix2i.matrix[0][1] = matrix[1][0];
        matrix2i.matrix[1][0] = matrix[0][1];
        matrix2i.matrix[1][1] = matrix[1][1];

    }

    /**
     * 
     * @return
     */
    public int determinate() {
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    }

    /**
     * 
     * @param vector2i
     */
    public void scale(Vector2i vector2i) {
        matrix[0][0] = vector2i.x;
        matrix[0][1] = 0;
        matrix[1][0] = 0;
        matrix[1][1] = vector2i.y;
    }

    /**
     * 
     * @param x
     * @param y
     */
    public void scale(int x, int y) {
        matrix[0][0] = x;
        matrix[0][1] = 0;
        matrix[1][0] = 0;
        matrix[1][1] = y;
    }

    /**
     * 
     * @param angle
     */
    public void rotate(int angle) {
        
        int cosAngle = (int)Math.cos(angle);
        int sinAngle = (int)Math.sin(angle);
        matrix[0][0] = cosAngle;
        matrix[0][1] = sinAngle;
        matrix[1][0] = -sinAngle;
        matrix[1][1] = cosAngle;
        
    }
}
